package auth

import (
	"errors"
	"time"

	"enterprise-base/internal/config"

	"github.com/golang-jwt/jwt/v5"
)

var (
	JwtSecret = []byte("Vy2iwV3tgS1AQVoFTiGVHcUYHicOSZVV")
	iss       = config.GlobalJWTConfig.Issuer
	hours     = config.GlobalJWTConfig.Hours
)

func GenerateJWT(userID uint64) (string, error) {
	claims := jwt.MapClaims{
		"exp":     jwt.NewNumericDate(time.Now().Add(time.Hour * hours)), // 有效期24小时
		"iat":     jwt.NewNumericDate(time.Now()),
		"iss":     iss,
		"user_id": userID,
	}

	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	tokenString, err := token.SignedString(JwtSecret)
	if err != nil {
		return "", err
	}
	return tokenString, nil
}

// options ...jwt.ParserOption
func ParseJwtWithClaims(jwtStr string) (jwt.Claims, error) {
	mc := jwt.MapClaims{}
	token, err := jwt.ParseWithClaims(jwtStr, &mc, func(token *jwt.Token) (interface{}, error) {
		return JwtSecret, nil
	})
	if err != nil {
		return nil, err
	}
	// 校验 Claims 对象是否有效，基于 exp（过期时间），nbf（不早于），iat（签发时间）等进行判断（如果有这些声明的话）。
	if !token.Valid {
		return nil, errors.New("invalid token")
	}
	// 验证 iss 字段
	if issuer, ok := mc["iss"].(string); !ok || issuer != iss {
		return nil, errors.New("invalid issuer")
	}
	return mc, nil
}
